﻿// 203.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
* http://oj.daimayuan.top/course/22/problem/900
*
给你一个整数 n，你需要按一定顺序输出所有由字符 0 和 1 组成的 n 位字符串。

输出第 k行为所有含有 k−1 个 1 的字符串。每一行的字符串按字典序排好，并用一个空格隔开，详见样例。

输入格式一行一个整数 n。

输出格式
输出 n行，每行若干个字符串，用空格隔开。

样例输入
3
样例输出
000
001 010 100
011 101 110
111
数据规模
对于所有数据，保证 2≤n≤18。
*/
#include <iostream>
#include <string>
#include <vector>

using namespace std;

string curr;
vector<string> ans[20];
int n;

void dfs(int idx,int cnt) {
	if (idx == n) {
		ans[cnt].push_back(curr);
		return;
	}

	//加0
	curr.push_back('0');
	dfs(idx + 1, cnt);
	curr.pop_back();

	//加1
	curr.push_back('1');
	dfs(idx + 1, cnt+1);
	curr.pop_back();
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	dfs(0,0);

	for (int i = 0; i <= n; i++) {
		for (int j = 0; j < ans[i].size(); j++) {
			cout << ans[i][j] << " ";
		}
		cout << endl;
	}

	return 0;
}

 